#pragma once

#include <functional>
#include <string>
#include <atomic>
#include <memory>
#include <thread>
// #include <unistd.h>

#include "../utility/Noncopyable.h"

class Thread : Noncopyable
{
public:
    // c++11 thread+lambda带数据方便，而不用自定义结构体打包数据
    // 线程函数都是无参的？可以用std::bind绑定参数
    using ThreadFunc = std::function<void()>;

    explicit Thread(ThreadFunc, const std::string &name = "");
    ~Thread();

    bool getIsStart() const;
    pid_t getTid() const;
    // const std::string &name() const;
    std::string getName() const;

    static int getNum(); // 后const保证对象不修改成员，static是类的不能用const

    void start();
    void join();

private:
    void setDefaultName();

    ThreadFunc func_; // 线程函数
    std::string name_;
    bool isStart_;
    bool isJoin_;
    pid_t tid_; // 运行时再绑定

    static std::atomic_int kNum; // 静态原子总线程数量

    // 注意：pthread_create() std::thread{}定义就启动了
    // 智能指针封装线程掌控生命周期，只是创建还没运行（用于线程池）
    std::shared_ptr<std::thread> thread_;
};